From: Stefano Stabellini Date: Mon, 2 Mar 2015 15:35:15 +0000 (+0000) Subject: libxl_set_memory_target: retain the same maxmem offset on top of the current target X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~3690 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=0c029c4da2;p=xen.git libxl_set_memory_target: retain the same maxmem offset on top of the current target In libxl_set_memory_target when setting the new maxmem, retain the same offset on top of the current target. In the future the offset will include memory allocated by QEMU for rom files. Signed-off-by: Stefano Stabellini Acked-by: Wei Liu Acked-by: Ian Campbell --- diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index a68f6efb2f..a085621920 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -4676,11 +4676,16 @@ int libxl_set_memory_target(libxl_ctx *ctx, uint32_t domid, uint32_t current_max_memkb = 0; char *memmax, *endptr, *videoram_s = NULL, *target = NULL; char *dompath = libxl__xs_get_dompath(gc, domid); - xc_domaininfo_t info; libxl_dominfo ptr; char *uuid; xs_transaction_t t; + libxl_dominfo_init(&ptr); + if (libxl_domain_info(ctx, &ptr, domid) < 0) + goto out_no_transaction; + + uuid = libxl__uuid2string(gc, ptr.uuid); + retry_transaction: t = xs_transaction_start(ctx->xsh); @@ -4756,13 +4761,12 @@ retry_transaction: } if (enforce) { - memorykb = new_target_memkb + videoram; - rc = xc_domain_setmaxmem(ctx->xch, domid, memorykb + - LIBXL_MAXMEM_CONSTANT); + memorykb = ptr.max_memkb - current_target_memkb + new_target_memkb; + rc = xc_domain_setmaxmem(ctx->xch, domid, memorykb); if (rc != 0) { LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xc_domain_setmaxmem domid=%d memkb=%d failed " - "rc=%d\n", domid, memorykb + LIBXL_MAXMEM_CONSTANT, rc); + "rc=%d\n", domid, memorykb, rc); abort_transaction = 1; goto out; } @@ -4781,18 +4785,9 @@ retry_transaction: libxl__xs_write(gc, t, libxl__sprintf(gc, "%s/memory/target", dompath), "%"PRIu32, new_target_memkb); - rc = xc_domain_getinfolist(ctx->xch, domid, 1, &info); - if (rc != 1 || info.domain != domid) { - abort_transaction = 1; - goto out; - } - libxl_dominfo_init(&ptr); - xcinfo2xlinfo(ctx, &info, &ptr); - uuid = libxl__uuid2string(gc, ptr.uuid); libxl__xs_write(gc, t, libxl__sprintf(gc, "/vm/%s/memory", uuid), "%"PRIu32, new_target_memkb / 1024); - libxl_dominfo_dispose(&ptr); out: if (!xs_transaction_end(ctx->xsh, t, abort_transaction) @@ -4801,6 +4796,7 @@ out: goto retry_transaction; out_no_transaction: + libxl_dominfo_dispose(&ptr); GC_FREE; return rc; }